/*-------------------------------------------------------------------------
 *
 * setenv.c
 *	  setenv() 的仿真，用于没有该函数的机器
 *
 * Portions Copyright (c) 1996-2022, PostgreSQL Global Development Group
 * Portions Copyright (c) 1994, Regents of the University of California
 *
 *
 * IDENTIFICATION
 *	  src/port/setenv.c
 *
 *-------------------------------------------------------------------------
 */

#include "c.h"


int setenv(const char *fc_name, const char *fc_value, int fc_overwrite)
{
	char	   *fc_envstr;

	/* 错误条件，符合 POSIX */
	if (fc_name == NULL || fc_name[0] == '\0' || strchr(fc_name, '=') != NULL ||
		fc_value == NULL)
	{
		errno = EINVAL;
		return -1;
	}

	/* 如果变量存在且我们不替换它，则不执行操作 */
	if (fc_overwrite == 0 && getenv(fc_name) != NULL)
		return 0;

	/*
	 * 使用 putenv() 添加或替换值。如果同一变量被反复重新定义，这将导致内存泄漏，但我们在使用 putenv() 时对此无能为力。
	 */
	fc_envstr = (char *) malloc(strlen(fc_name) + strlen(fc_value) + 2);
	if (!fc_envstr)				/* 如果没有内存，我们能做的也不多 */
		return -1;

	sprintf(fc_envstr, "%s=%s", fc_name, fc_value);

	return putenv(fc_envstr);
}
